<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>登录页</title>
    <link rel="stylesheet" href="css/normalize.css">
    <link rel="stylesheet" href="css/login.css">
    <script src="js/jquery-1.9.1.min.js"></script>
    <script src="js/factory/config.js"></script>
    <script src="js/login/SoftKey3W.js"></script>
</head>
<body onload="load()">
<div class="login" style="width: 365px">
    <h1>朝阳区市容智能审查系统</h1>
    <input type="password" id="pin" placeholder="密码" required="required" />
    <input type="button" class="btn btn-primary btn-block btn-large" onclick="USBKeyLogin()" value="登录">
</div>
</body>

<script type="text/javascript">
    var bConnect=0;
    var userId = "";

    function load()
    {
        //如果是IE10及以下浏览器，则跳过不处理
        if(navigator.userAgent.indexOf("MSIE")>0 && !navigator.userAgent.indexOf("opera") > -1) return;
        try
        {
            var s_pnp=new SoftKey3W();
            s_pnp.Socket_UK.onopen = function()
            {
                bConnect=1;//代表已经连接，用于判断是否安装了客户端服务
            }

            //在使用事件插拨时，注意，一定不要关掉Sockey，否则无法监测事件插拨
            s_pnp.Socket_UK.onmessage =function got_packet(Msg)
            {
                var PnpData = JSON.parse(Msg.data);
                if(PnpData.type=="PnpEvent")//如果是插拨事件处理消息
                {
                    if(PnpData.IsIn)
                    {
                        //alert("UKEY已被插入，被插入的锁的路径是："+PnpData.DevicePath);
                    }
                    else
                    {
                        //alert("UKEY已被拨出，被拨出的锁的路径是："+PnpData.DevicePath);
                    }
                }
            }

            s_pnp.Socket_UK.onclose = function()
            {

            }
        }
        catch(e)
        {
            alert(e.name + ": " + e.message);
            return false;
        }
    }

    var digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');

    function toHex( n ) {

        var result = ''
        var start = true;

        for ( var i=32; i>0; ) {
            i -= 4;
            var digit = ( n >> i ) & 0xf;

            if (!start || digit != 0) {
                start = false;
                result += digitArray[digit];
            }
        }

        return ( result == '' ? '0' : result );
    }
    function USBKeyLogin()
    {
        var Pin = $("#pin").val();
        var randomNumber = "123456";

        //判断是否安装了服务程序，如果没有安装提示用户安装
        if(bConnect==0)
        {
            window.alert ( "未能连接服务程序，请确定服务程序是否安装。");return false;
        }
        try
        {
            var DevicePath,mylen,ret,keyid,username,mykey,outstring,address,mydata,i,InString,versionex,version;
            var PubKeyX,PubKeyY,PriKey,UserName;

            //由于是使用事件消息的方式与服务程序进行通讯，
            //好处是不用安装插件，不分系统及版本，控件也不会被拦截，同时安装服务程序后，可以立即使用，不用重启浏览器
            //不好的地方，就是但写代码会复杂一些
            var s_simnew1=new SoftKey3W(); //创建UK类

            s_simnew1.Socket_UK.onopen = function() {
                s_simnew1.ResetOrder();//这里调用ResetOrder将计数清零，这样，消息处理处就会收到0序号的消息，通过计数及序号的方式，从而生产流程
            }

            //写代码时一定要注意，每调用我们的一个UKEY函数，就会生产一个计数，即增加一个序号，较好的逻辑是一个序号的消息处理中，只调用我们一个UKEY的函数
            s_simnew1.Socket_UK.onmessage =function got_packet(Msg)
            {
                var UK_Data = JSON.parse(Msg.data);
                if(UK_Data.type!="Process")return ;//如果不是流程处理消息，则跳过
                //alert(Msg.data);
                switch(UK_Data.order)
                {
                    case 0:
                    {
                        s_simnew1.FindPort(0);//查找加密锁
                    }
                        break;//!!!!!重要提示，如果在调试中，发现代码不对，一定要注意，是不是少了break,这个少了是很常见的错误
                    case 1:
                    {
                        if( UK_Data.LastError!=0){window.alert ( "未发现加密锁，请插入加密锁");s_simnew1.Socket_UK.close();return false;}
                        DevicePath=UK_Data.return_value;//获得返回的UK的路径
                        s_simnew1.GetChipID(DevicePath);//返回芯片唯一ID
                    }
                        break;
                    case 2:
                    {
                        if( UK_Data.LastError!=0){window.alert("返回芯片唯一ID时出现错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
                        outstring = UK_Data.return_value;
                        userId = outstring;
                        //window.alert("已成功返回芯片唯一ID：" + outstring);
                        //对数据进行加密
                        s_simnew1.SM2_EncString(randomNumber,DevicePath);
                    }
                        break;
                    case 3:
                    {
                        if( UK_Data.LastError!=0){window.alert("对数据进行加密时出现错误，错误码为："+UK_Data.LastError.toString());s_simnew1.Socket_UK.close();return false;}
                        outstring = UK_Data.return_value;
                        //window.alert("已成功对数据进行加密，加密后的数据是：" + outstring);

                        keyLogin(userId,Pin,randomNumber,outstring);
                    }
                        break;
                }
            }

            s_simnew1.Socket_UK.onclose = function(){

            }
            return true;
        }

        catch(e)
        {
            alert(e.name + ": " + e.message);
            return false;
        }

    }

    function keyLogin(userId,pin,code,encCode){
        //ajax去服务器端校验
        $.ajax({
            url :   prefixUrl + "user/key/login",
            type:   "post",
            data:JSON.stringify({
                userId : userId,
                pin  : pin,
                code : code,
                encCode: encCode
            }),
            contentType:"application/json;",
            success:function(data) {
                if(data.code==0){
                    if(data.data.state == 1){
                        location.href = prefixUrl + "/apply.html";
                    }else if(data.data.state == 2){
                        location.href = prefixUrl + "/audit.html";
                    }else{
                        location.href = prefixUrl + "/apply.html";
                    }
                }else{
                    alert(data.msg);
                }
            }
        });
    }

</script>
</html>